//package com.enation.app.javashop.service.payment.plugin.abcpay;
//
//import com.abc.pay.client.JSON;
//import com.abc.pay.client.ebus.common.EBusMerchantCommonRequest;
//import com.enation.app.javashop.framework.cache.Cache;
//import com.enation.app.javashop.framework.context.request.ThreadContextHolder;
//import com.enation.app.javashop.framework.util.CurrencyUtil;
//import com.enation.app.javashop.framework.util.JsonUtil;
//import com.enation.app.javashop.framework.util.StringUtil;
//import com.enation.app.javashop.model.payment.enums.AbcpayConfigItem;
//import com.enation.app.javashop.model.payment.enums.ClientType;
//import com.enation.app.javashop.model.payment.vo.ClientConfig;
//import com.enation.app.javashop.model.payment.vo.PayBill;
//import com.enation.app.javashop.model.payment.vo.PayConfigItem;
//import com.enation.app.javashop.model.payment.vo.RefundBill;
//import com.enation.app.javashop.model.trade.order.enums.TradeTypeEnum;
//import com.enation.app.javashop.service.payment.AbstractPaymentPlugin;
//import com.enation.app.javashop.service.payment.PaymentPluginManager;
//import com.enation.app.javashop.service.payment.plugin.unionpay.JavashopUnionpayUtil;
//import com.enation.app.javashop.service.payment.plugin.unionpay.UnionpayConfig;
//import com.enation.app.javashop.service.payment.plugin.unionpay.sdk.AcpService;
//import com.enation.app.javashop.service.payment.plugin.unionpay.sdk.LogUtil;
//import com.enation.app.javashop.service.payment.plugin.unionpay.sdk.SDKConfig;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Service;
//
//import javax.servlet.http.HttpServletRequest;
//import java.text.SimpleDateFormat;
//import java.util.*;
//
//public class AbcPayPlugin extends AbstractPaymentPlugin implements PaymentPluginManager {
//    public static String encoding = "UTF-8";
//
//    @Autowired
//    private Cache cache;
//
//    @Override
//    public String getPluginId() {
//        return "abcPayPlugin";
//    }
//
//    @Override
//    public String getPluginName() {
//        return "农行";
//    }
//
//    @Override
//    public List<ClientConfig> definitionClientConfig() {
//        List<ClientConfig> resultList = new ArrayList<>();
//
//        ClientConfig config = new ClientConfig();
//
//        List<PayConfigItem> configList = new ArrayList<>();
//        for (AbcpayConfigItem value : AbcpayConfigItem.values()) {
//            PayConfigItem item = new PayConfigItem();
//            item.setName(value.name());
//            item.setText(value.getText());
//            configList.add(item);
//        }
//
//        config.setKey(ClientType.PC.getDbColumn() + "&" + ClientType.WAP.getDbColumn() + "&" + ClientType.NATIVE.getDbColumn() + "&" + ClientType.REACT.getDbColumn());
//        config.setConfigList(configList);
//        config.setName("是否开启");
//
//        resultList.add(config);
//
//        return resultList;
//    }
//
//    @Override
//    public Map pay(PayBill bill) {
//        Map<String, String> config = this.getConfig(bill.getClientType());
//        String merId = config.get(AbcpayConfigItem.MerchantID.name());
//        String merPath = config.get(AbcpayConfigItem.MerchantCertFile.name());
//        String payUrl = config.get(AbcpayConfigItem.TrustPayIETrxURL.name());
//        String paymentType = "";
//
//        HttpServletRequest request = ThreadContextHolder.getHttpRequest();
//
//        EBusMerchantCommonRequest eBusMerchantCommonRequest = new EBusMerchantCommonRequest();
//        eBusMerchantCommonRequest.dicRequest.put("PaymentType", paymentType);            //设定支付类型
//        eBusMerchantCommonRequest.dicRequest.put("PaymentLinkType", request.getParameter("PaymentLinkType"));    //设定支付接入方式
//        eBusMerchantCommonRequest.dicRequest.put("ReceiveAccount", request.getParameter("ReceiveAccount"));      //设定收款方账号
//        eBusMerchantCommonRequest.dicRequest.put("ReceiveAccName", request.getParameter("ReceiveAccName"));      //设定收款方户名
//        eBusMerchantCommonRequest.dicRequest.put("NotifyType", request.getParameter("NotifyType"));              //设定通知方式
//        eBusMerchantCommonRequest.dicRequest.put("ResultNotifyURL", request.getParameter("ResultNotifyURL"));    //设定通知URL地址
//        eBusMerchantCommonRequest.dicRequest.put("MerchantRemarks", request.getParameter("MerchantRemarks"));    //设定附言
//        eBusMerchantCommonRequest.dicRequest.put("IsBreakAccount", request.getParameter("IsBreakAccount"));      //设定交易是否分账、交易是否支持向二级商户入账
//        eBusMerchantCommonRequest.dicRequest.put("SplitAccTemplate", request.getParameter("SplitAccTemplate"));  //分账模版编号
//        if ("1".equals(request.getParameter("VerifyFlag"))) {
//            eBusMerchantCommonRequest.dicRequest.put("VerifyFlag", request.getParameter("VerifyFlag"));  //是否实名验证
//            eBusMerchantCommonRequest.dicRequest.put("VerifyType", request.getParameter("VerifyType"));  //证件类型
//            eBusMerchantCommonRequest.dicRequest.put("VerifyNo", request.getParameter("VerifyNo"));  //证件号码
//        }
//        LinkedHashMap dicOrder = new LinkedHashMap();
//        eBusMerchantCommonRequest.dicRequest.put("TrxType", "PayReq");
//        dicOrder.put("PayTypeID", request.getParameter("PayTypeID"));                   //设定交易类型
//        dicOrder.put("OrderDate", request.getParameter("OrderDate"));                  //设定订单日期 （必要信息 - YYYY/MM/DD）
//        dicOrder.put("OrderTime", request.getParameter("OrderTime"));                   //设定订单时间 （必要信息 - HH:MM:SS）
//        dicOrder.put("orderTimeoutDate", request.getParameter("orderTimeoutDate"));     //设定订单有效期
//        dicOrder.put("OrderNo", request.getParameter("OrderNo"));                       //设定订单编号 （必要信息）
//        dicOrder.put("CurrencyCode", request.getParameter("CurrencyCode"));             //设定交易币种
//        dicOrder.put("OrderAmount", request.getParameter("OrderAmount"));      //设定交易金额
//        dicOrder.put("SubsidyAmount", request.getParameter("SubsidyAmount"));       //设定补贴金额
//        dicOrder.put("Fee", request.getParameter("Fee"));                               //设定手续费金额
//        dicOrder.put("AccountNo", request.getParameter("AccountNo"));                   //设定支付账户
//        dicOrder.put("OrderDesc", request.getParameter("OrderDesc"));                   //设定订单说明
//        dicOrder.put("OrderURL", request.getParameter("OrderURL"));                     //设定订单地址
//        dicOrder.put("ReceiverAddress", request.getParameter("ReceiverAddress"));       //收货地址
//        dicOrder.put("InstallmentMark", request.getParameter("InstallmentMark"));       //分期标识
//        if (("1".equals(request.getParameter("InstallmentMark"))) && ("DividedPay".equals(request.getParameter("PayTypeID")))) {
//            dicOrder.put("InstallmentCode", request.getParameter("InstallmentCode"));   //设定分期代码
//            dicOrder.put("InstallmentNum", request.getParameter("InstallmentNum"));     //设定分期期数
//        }
//        dicOrder.put("CommodityType", request.getParameter("CommodityType"));           //设置商品种类
//        dicOrder.put("BuyIP", request.getParameter("BuyIP"));                           //IP
//        dicOrder.put("ExpiredDate", request.getParameter("ExpiredDate"));               //设定订单保存时间
//        dicOrder.put("OrderItems",request.getParameter("OrderItems"));
//        dicOrder.put("SplitAccInfoItems", request.getParameter("SplitAccInfoItems"));    //平台商户当前分账情况
//        eBusMerchantCommonRequest.dicRequest.put("Order", dicOrder);
//
//        JSON json = eBusMerchantCommonRequest.postRequest();
//        LinkedHashMap<String, Object> resultMap = JsonUtil.toMap(json.getIJsonString());
//
//        return resultMap;
//    }
//
//    @Override
//    public void onReturn(TradeTypeEnum tradeType) {
//        HttpServletRequest request = ThreadContextHolder.getHttpRequest();
//        //商户订单号
//        String orderSn = request.getParameter("orderId");
//        try {
//            //应答码
//            String respCode = request.getParameter("respCode");
//            //应答信息
//            String respMsg = request.getParameter("respMsg");
//            //流水号
//            String queryId = request.getParameter("queryId");
//            //系统追踪号
//            String tradeno = request.getParameter("traceNo");
//            //交易金额
//            String settleAmt = request.getParameter("settleAmt");
//
//            double payPrice = StringUtil.toDouble(settleAmt, 0d);
//            // 传回来的是分，转为元
//            payPrice = CurrencyUtil.mul(payPrice, 0.01);
//
//            //交易成功
//            if ("00".equals(respCode)) {
//                if (JavashopUnionpayUtil.validaeData()) {
//
//                    this.paySuccess(orderSn, queryId, payPrice);
//
//                } else {
//                    throw new RuntimeException("验证失败");
//                }
//            } else {
//                throw new RuntimeException("验证失败，错误信息:" + respMsg);
//            }
//
//        } catch (Exception e) {
//            throw new RuntimeException("验证失败");
//        }
//    }
//
//    @Override
//    public String onCallback(ClientType clientType) {
//        HttpServletRequest request = ThreadContextHolder.getHttpRequest();
//        //商户订单号
//        String orderSn = request.getParameter("orderId");
//        try {
//            //应答码
//            String respCode = request.getParameter("respCode");
//            //应答信息
//            String respMsg = request.getParameter("respMsg");
//            //流水号
//            String queryId = request.getParameter("queryId");
//            //系统追踪号
//            String tradeno = request.getParameter("traceNo");
//            //交易金额
//            String settleAmt = request.getParameter("settleAmt");
//
//            double payPrice = StringUtil.toDouble(settleAmt, 0d);
//            // 传回来的是分，转为元
//            payPrice = CurrencyUtil.mul(payPrice, 0.01);
//
//            //交易成功
//            if ("00".equals(respCode)) {
//                if (JavashopUnionpayUtil.validaeData()) {
//
//                    return orderSn;
//                } else {
//                    throw new RuntimeException("验证失败");
//                }
//            } else {
//                throw new RuntimeException("验证失败，错误信息:" + respMsg);
//            }
//
//        } catch (Exception e) {
//            throw new RuntimeException("验证失败");
//        }
//    }
//
//    @Override
//    public String onQuery(String billSn, Map config) {
//        return null;
//    }
//
//    @Override
//    public boolean onTradeRefund(RefundBill bill) {
//        Map<String, String> config = bill.getConfigMap();
//
//        /**
//         * 组装请求报文
//         */
//        Map<String, String> data = new HashMap<String, String>(16);
//        // 版本号
//        data.put("version", "5.0.0");
//        // 字符集编码 默认"UTF-8"
//        data.put("encoding", "UTF-8");
//        // 签名方法 01 RSA
//        data.put("signMethod", "01");
//        // 交易类型 04-退货
//        data.put("txnType", "04");
//        // 交易子类型 01:自助消费 02:订购 03:分期付款
//        data.put("txnSubType", "00");
//        // 业务类型
//        data.put("bizType", "000201");
//        // 渠道类型，07-PC，08-手机
//        data.put("channelType", "07");
//        /**
//         * 因中国银联5.0退款接口只有在退款成功的情况下才会回调，如果退款失败则无法回调，所以不通过异步回调获取退款状态
//         * 通过查询退款状态交易查询接口获取退款状态
//         */
//        // 后台通知地址
//        data.put("backUrl", "http://www.specialurl.com");
//        // 接入类型，商户接入填0 0- 商户 ， 1： 收单， 2：平台商户
//        data.put("accessType", "0");
//        // 商户号码，请改成自己的商户号
//        data.put("merId", UnionpayConfig.merId);
//        // 商户订单号，8-40位数字字母
//        // 因为 银联要求的订单号不能有-号，在javashop中的子订单是有这个符号的，所以改用orderid
//        String refundSn = bill.getRefundSn();
//
//        data.put("orderId", refundSn);
//        // 订单发送时间，取系统时间
//        String txnTime = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
////        cache.put("{refundtime}_" + refundSn, txnTime);
//        data.put("txnTime", txnTime);
//        // 交易金额，单位分
//        Double txnAmt = CurrencyUtil.mul(bill.getRefundPrice(), 100);
//
//        data.put("txnAmt", "" + txnAmt.intValue());
//        // 交易币种
//        data.put("currencyCode", "156");
//        // ****原消费交易返回的的queryId，可以从消费交易后台通知接口中或者交易状态查询接口中获取
//        data.put("origQryId", bill.getReturnTradeNo());
//        // 报文中certId,signature的值是在signData方法中获取并自动赋值的，只要证书配置正确即可。
//        Map<String, String> reqData = AcpService.sign(data, encoding);
//
//        // 交易请求url 从配置文件读取
//        String url = SDKConfig.getConfig().getBackRequestUrl();
//        // 这里调用signData之后，调用submitUrl之前不能对submitFromData中的键值对做任何修改，如果修改会导致验签不通过
//        Map<String, String> rspData = AcpService.post(reqData, url, encoding);
//
//        // 应答码规范参考open.unionpay.com帮助中心 下载 产品接口规范 《平台接入接口规范-第5部分-附录》
//        if (!rspData.isEmpty()) {
//            if (AcpService.validate(rspData, "UTF-8")) {
//                LogUtil.writeLog("验证签名成功");
//                String respCode = rspData.get("respCode");
//                if ("00".equals(respCode)) {
//                    // 交易已受理，等待接收后台通知更新订单状态,也可以主动发起 查询交易确定交易状态。
//                    return true;
//                } else // 后续需发起交易状态查询交易确定交易状态
//                {
//                    return "03".equals(respCode) || "04".equals(respCode) || "05".equals(respCode);
//                }
//            } else {
//                LogUtil.writeErrorLog("验证签名失败");
//            }
//        } else {
//            // 未返回正确的http状态
//            LogUtil.writeErrorLog("未获取到返回报文或返回http状态码非200");
//        }
//
//        return false;
//    }
//
//    @Override
//    public String queryRefundStatus(RefundBill bill) {
//        Map<String, String> config = bill.getConfigMap();
//
//        /**
//         * 组装请求报文
//         */
//        Map<String, String> data = new HashMap<String, String>(16);
//        // 版本号
//        data.put("version", "5.0.0");
//        // 字符集编码 默认"UTF-8"
//        data.put("encoding", "UTF-8");
//        // 签名方法 01 RSA
//        data.put("signMethod", "01");
//        // 交易类型 00-默认货
//        data.put("txnType", "00");
//        // 交易子类型 01:自助消费 02:订购 03:分期付款
//        data.put("txnSubType", "00");
//        // 业务类型
//        data.put("bizType", "000201");
//        // 接入类型，商户接入填0 0- 商户 ， 1： 收单， 2：平台商户
//        data.put("accessType", "0");
//        // 商户号码，请改成自己的商户号
//        data.put("merId", UnionpayConfig.merId);
//        // 商户订单号，8-40位数字字母
//        //因为 银联要求的订单号不能有-号，在javashop中的子订单是有这个符号的，所以改用orderid
//        String refundSn = bill.getRefundSn();
//        data.put("orderId", refundSn);
//        //****订单发送时间，被查询的交易的订单发送时间
////        data.put("txnTime", (String) cache.get("refundtime_" + refundSn));
//
//        //报文中certId,signature的值是在signData方法中获取并自动赋值的，只要证书配置正确即可。
//        Map<String, String> reqData = AcpService.sign(data, encoding);
//
//        // 交易请求url从配置文件读取对应属性文件acp_sdk.properties中的 acpsdk.singleQueryUrl
//        String url = SDKConfig.getConfig().getSingleQueryUrl();
//
//        //这里调用signData之后，调用submitUrl之前不能对submitFromData中的键值对做任何修改，如果修改会导致验签不通过
//        Map<String, String> rspData = AcpService.post(reqData, url, encoding);
//
//        //应答码规范参考open.unionpay.com帮助中心 下载  产品接口规范  《平台接入接口规范-第5部分-附录》
//        if (!rspData.isEmpty()) {
//            if (AcpService.validate(rspData, encoding)) {
//                LogUtil.writeLog("验证签名成功");
//                //如果查询交易成功
//                if ("00".equals(rspData.get("respCode"))) {
//                    //处理被查询交易的应答码逻辑
//                    String origRespCode = rspData.get("origRespCode");
//                    if ("00".equals(origRespCode)) {
//                        cache.remove("{refundtime}_" + refundSn);
//                        return "";
//                    } else if ("03".equals(origRespCode) ||
//                            "04".equals(origRespCode) ||
//                            "05".equals(origRespCode)) {
//                        //需再次发起交易状态查询交易
//                    } else {
//                        //其他应答码为失败请排查原因
//                        return "";
//                    }
//                } else {//查询交易本身失败，或者未查到原交易，检查查询交易报文要素
//                    return "";
//                }
//            } else {
//                LogUtil.writeErrorLog("验证签名失败");
//            }
//        } else {
//            //未返回正确的http状态
//            LogUtil.writeErrorLog("未获取到返回报文或返回http状态码非200");
//        }
//        return "";
//    }
//
//    @Override
//    public Integer getIsRetrace() {
//        return null;
//    }
//
//    @Override
//    public void closeTrade(Map<String, String> configMap, String outTradeNo) {
//
//    }
//}
